﻿#ifndef WRWORKTCPCOMMCLIENTAFFAIR_H
#define WRWORKTCPCOMMCLIENTAFFAIR_H

#include "../WRWorkAffair.h"
#include "WRWorkTcpCommClientObject.h"

#include <QMutex>
#include <QSemaphore>

//表示工作TCP通讯客户端事务。
class WRSOFT_WORKING_COMMON_CLASS WRWorkTcpCommClientAffair : public WRWorkAffair
{
private:
    typedef WRWorkTcpCommClientInterface* Interface;
    typedef WRArray<Interface> Interfaces;

    //表示处理项目。
    class ProcEntry
    {
    private:
        int m_serial;
        QUuid m_uuid;
        Interface m_target;
        QSemaphore m_mutex;

    public:
        //初始化处理项目。
        inline ProcEntry(const QUuid& uuid, int serial)
            : m_serial(serial), m_uuid(uuid), m_target(0)
        {
            //add code here
        }

        //获取标识。
        inline const QUuid& uuid(void) const
        {
            return m_uuid;
        }
        //获取序号。
        inline int serial(void) const
        {
            return m_serial;
        }

        //获取目标对象。
        inline Interface target(void) const
        {
            return m_target;
        }

        //等待完成。
        inline bool wait(int timeout = 10000)
        {
            return m_mutex.tryAcquire(1, timeout);
        }
        //完成处理。
        inline void fulfil(Interface target = 0)
        {
            m_target = target;
            m_mutex.release();
        }
    };

    int m_id;
    int m_index;
    Interfaces m_interfaces;
    QMutex m_mutex;
    int m_timeout;
    int m_sequence;
    ProcEntry* m_procEntry;
    QMutex m_procMutex;

public:
    //初始化工作TCP通讯客户端事务。
    WRWorkTcpCommClientAffair(int id, int index, WRWorkTcpCommClientObject* object);
    //清理当前对象所占用的相关资源。
    ~WRWorkTcpCommClientAffair(void);

    //获取标识。
    inline int id(void) const
    {
        return m_id;
    }
    //获取索引。
    inline int index(void) const
    {
        return m_index;
    }
    //获取对象。
    inline WRWorkTcpCommClientObject* object(void) const
    {
        return static_cast<WRWorkTcpCommClientObject*>(WRWorkAffair::object());
    }

    //处理数据。
    void procData(const unsigned char* buf, int len);

    //查询指定标识的工作处理者。
    WRWorkDealer* queryWorkDealer(const QUuid &uuid);
    //查询指定标识的任务处理者。
    WRTaskDealer* queryTaskDealer(const QUuid& uuid);
    //查询指定标识的数据源接口。
    WRDataSource* queryDataSource(const QUuid& uuid);
    //查询指定标识的事件源接口。
    WREventSource* queryEventSource(const QUuid& uuid);
    //查询指示标识的状态源接口。
    WRStateSource* queryStateSource(const QUuid& uuid);
};

#endif // WRWORKTCPCOMMCLIENTAFFAIR_H
